home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1995 October / EnigmA AMIGA RUN 01 (1995)(G.R. Edizioni)(IT)[!][issue 1995-10][Aminet 7].iso / Aminet / comm / xeno / bbbbscd.lha / BBBBScd / System / s / bbsExtDL.shell < prev    next >
Text File  |  1995-03-18  |  21KB  |  805 lines

  1. /* Based on: bbsExtDL.shell 8.2 (17.10.94) copyright 1992-94 Richard Stockton
  2.                          FREELY DISTRIBUTABLE
  3.  
  4. ****************************************************************************
  5. CONVERTED FOR XENOLINK PRO BBS. $VERS:1.0 (18.03.95) by Derek Scott,2:259/75
  6. ****************************************************************************
  7.  
  8. Allows Xenolink user to download from extra devices like CD drives.
  9. Keeps track of time left to this user.
  10.  
  11. Just ignores file or directory names that contain spaces because Xenolink
  12. would be unable to download them anyway. (But handles recursive files &
  13. directories OK, archived by LZX by use of 'SELECT ALL' parameter)
  14.  
  15. Ignores icons (files that end in .info).
  16.  
  17. A textfile  CD_Exclude , controls exclusion of drawers on certain CDs that
  18. contain copyright files. Other specific files or directories can be excluded
  19. by adding their paths to the CD_Exclude textfile, one path per line.
  20.  
  21. Super-sysop may select very large directories and have their formatted 
  22. display lists cached as textfiles in bbspath'Cache'. This can greatly 
  23. improve access time for very large drawers, especially if they contain
  24. sub-directories.
  25.  
  26. Ability to 'READ' text files from within CD door.
  27.  
  28. Configurable 'maximum size' of user selected files/output archive.
  29.  
  30. All Selected files are Archived with LZX and attached to private mail for
  31. user. (requires "Junkmail" Xenolink utility by Alan Bland)
  32. */
  33.  
  34.  
  35.  OPTIONS RESULTS  /*sets internal default to request RESULTS string from host*/
  36.  FF='0C'x         /* defines hex-decimal value for FORM FEED (clear screen)*/
  37.  CR='0D'x         /* defines hex-decimal value for CARRIAGE RETURN*/
  38.  
  39. SIGNAL ON BREAK_C
  40. SIGNAL ON BREAK_E
  41. SIGNAL ON ERROR
  42.  
  43. PARSE ARG name
  44. IF name='' THEN EXIT
  45.  
  46. cfgfile='xconfig:BBBBScd.config'
  47.  
  48.  
  49.  
  50.  /* Open the support library if it is not already open.  (yawn...)*/
  51.  
  52.  if ~show('L',"rexxsupport.library") THEN
  53.    DO
  54.     addlib('rexxsupport.library',0,-30,0)
  55.    END
  56.  
  57.  if ~show('L',"rexxmathlib.library") THEN
  58.    DO
  59.     addlib('rexxmathlib.library',0,-30,0)
  60.    END
  61. SAY ' '
  62.  
  63.  if ~show('L',"rexxarplib.library") THEN
  64.    DO
  65.     addlib('rexxarplib.library',0,-30,0)
  66.    END
  67.  
  68. IF ~SHOW('P','QuickSortPort') THEN 
  69. DO
  70.   /*  Add the QuickSort port, so we can use QSORT.
  71.    *   First check if the port is already up. If not, run QuickSort
  72.    *   and wait for the port to be there  */
  73.   if ~showlist('p','QuickSortPort') then
  74.   do
  75.     ADDRESS COMMAND "run quicksort >NIL:"
  76.     do i = 1 to 10
  77.       if ~showlist('p','QuickSortPort') then call delay 20
  78.       else leave i
  79.     end
  80.     if showlist('p','QuickSortPort') then call addlib('QuickSortPort',-30)   
  81.   end
  82. end
  83. IF ~SHOW('P','QuickSortPort') THEN EXIT 666
  84.  
  85.  
  86. /* read the configuration parameters from XCONFIG:BBBBScd.CFG */
  87. x=OPEN(f,cfgfile,'R')
  88. IF x~=0 THEN 
  89.   DO
  90.     bbspath=READLN(f)
  91.     devlist=READLN(f)
  92.     sysoplevel=VALUE(WORD(READLN(f),1))
  93.     junk=READLN(f)
  94.     junk=READLN(f)
  95.     xrecursive_size=VALUE(WORD(READLN(f),1))
  96.     junk=READLN(f)
  97.     lzxflag=READLN(f)
  98.     CALL CLOSE(f)
  99.   END
  100. ELSE
  101.   /* can't open config file, so use defaults... :) */
  102.   DO
  103.     bbspath='doors:bbbbsCD/'
  104.     devlist='CD0: CD1: CD2: CD50: CD51: CD52: CD53: CD54: CD55: CD56:'
  105.     sysoplevel=224 
  106.     lzxflag='N'
  107.   END
  108. /***************************************************************************/
  109.  
  110.  
  111. /* set additional parameters about user, passed by Xenolink node */
  112. level=255
  113. maxtime=3600
  114. linesperpage=24
  115. menuset=1
  116. nodex=0
  117. namex=name
  118. colorflag=1
  119. node=nodex
  120.  
  121. exclude=''
  122. x=OPEN(f,bbspath'CD_Exclude','R')
  123. IF x~=0 THEN exclude=READCH(f,65000)
  124. CALL CLOSE(f)
  125. exclude=UPPER(TRANSLATE(exclude,' ','0A'x))
  126.  
  127. lists.=''
  128. lists.0=0
  129. maxtime=maxtime-30
  130. CALL TIME('R')
  131. CR='0D'x
  132. def=''
  133. pen3=''
  134. IF colorflag<1 THEN
  135.   DO
  136.     def=''
  137.     pen3=''
  138.   END
  139. ELSE colorflag=1
  140.  
  141.  
  142. saytxt=FF
  143. SAY saytxt
  144.  
  145. x=OPEN(f,bbspath'EXT_INFO','R')
  146. IF x=0 THEN SAY bbspath'EXT_INFO failed to open!'
  147. ELSE
  148.   DO
  149.     DO i=1 WHILE ~EOF(f)
  150.       saytxt=READLN(f)||CR
  151.       SAY saytxt
  152.       IF (i+2)//linesperpage=0 THEN
  153.         DO
  154.           OPTIONS PROMPT 'Press RETURN'
  155.           PULL junk
  156.           saytxt='1B'x'M'||'1B'x'M'CR
  157.           SAY saytxt
  158.         END
  159.     END
  160.     CALL CLOSE(f)
  161.   END
  162. selected=''
  163. path=''
  164. templist=devlist
  165. devlist=''
  166. longest=0
  167. CALL PRAGMA('W','N')  /* disk requesters OFF */
  168. CALL PRAGMA('D',bbspath'Information')
  169. test3=PRAGMA('D')
  170. DO i=1 TO WORDS(templist)
  171.   test=WORD(templist,i)
  172.   IF ~EXISTS(test) THEN ITERATE i
  173.   IF SHOWLIST('A',UPPER(LEFT(test,LENGTH(test)-1))) THEN test2=test
  174.   ELSE
  175.     DO
  176.       CALL PRAGMA('D',test)
  177.       test2=PRAGMA('D')
  178. /************************************************************/
  179. /* DAS - Fool System into thinking Assigns are REAL Devices */
  180.       IF test2='d::' THEN test2='Pro_CD1:'
  181. /* DAS */
  182. /************************************************************/
  183.       IF test2=test3 THEN ITERATE i
  184.       IF WORDS(test2)>1 THEN test2=test
  185.     END
  186.   devlist=STRIP(devlist test2)
  187.   IF LENGTH(test2)>longest THEN longest=LENGTH(test2)
  188. END
  189. cols=76%(longest+8)
  190. IF devlist='' THEN
  191.   DO
  192.     SAY
  193.     saytxt='*** Sorry, no External Devices are available! ***'CR
  194.     SAY saytxt
  195.     SAY
  196.     OPTIONS PROMPT  'Press RETURN'
  197.     PULL junk
  198.     EXIT('')
  199.   END
  200.  
  201. picklist=devlist
  202. IF WORDS(picklist)=1 THEN
  203.   DO
  204.     path=picklist
  205.     IF RIGHT(path,1)~=':' THEN path=path'/'
  206.     picklist=makepicklist()
  207.   END
  208. ELSE
  209.   DO
  210.     lists.0=1
  211.     dirs=WORDS(devlist)
  212.   END
  213.  
  214. OPTIONS PROMPT  'Press RETURN'
  215. PULL junk
  216.  
  217. DO loop=1
  218.   test=TIME('E')
  219.   IF test>(maxtime-100) THEN
  220.     DO
  221.       SAY
  222.       IF test>maxtime THEN
  223.         DO
  224.           saytxt='*** This session''s time is expiring! ***'CR
  225.           SAY saytxt
  226.           SAY
  227.           LEAVE loop
  228.         END
  229.       ELSE SAY '*** Less than 2 minutes remaining! ***'
  230.       SAY CR
  231.     END
  232.   filename=pick(picklist)
  233.   IF filename='' THEN
  234.     DO
  235.       temp=path
  236.       IF RIGHT(temp,1)='/' THEN temp=LEFT(temp,LENGTH(temp)-1)
  237.       IF FIND(UPPER(devlist),UPPER(temp))>0 THEN
  238.         DO
  239.           IF WORDS(devlist)=1 THEN ITERATE loop
  240.           picklist=devlist
  241.           path=''
  242.           ITERATE loop
  243.         END
  244.       ELSE
  245.         DO
  246.           test=RIGHT(path,1)
  247.           IF test='/' THEN path=LEFT(path,LENGTH(path)-1)
  248.           slash=LASTPOS('/',path)
  249.           IF slash=0 THEN slash=LASTPOS(':',path)
  250.           path=LEFT(path,slash)
  251.         END
  252.     END
  253.   IF filename=':-)' THEN ITERATE loop
  254.   tempath=path||filename
  255.   temp=WORD(STATEF(tempath),1)
  256.   IF temp='FILE' THEN
  257.     DO
  258.       IF FIND(UPPER(selected),UPPER(tempath))=0 THEN
  259.         selected=selected tempath
  260.       ELSE selected=DELWORD(selected,FIND(UPPER(selected),UPPER(tempath)),1)
  261.       shosel=''
  262.       ITERATE loop
  263.     END
  264.   ELSE IF temp='DIR' THEN
  265.     DO
  266.       path=tempath
  267.       test=RIGHT(path,1)
  268.       IF test~='' & test~='/' & test~=':' THEN path=path'/'
  269.     END
  270.   ELSE IF UPPER(filename)='DONE' THEN LEAVE loop
  271.   IF path~='' THEN picklist=makepicklist()
  272. END
  273. selected=STRIP(selected)
  274. test=''
  275. /* IF WORDS(selected)>0 THEN test=UPPER(RIGHT(selected,4))
  276. IF selected~='' & test~='.LZX' & test~='.LHA' & test~='.LZH' & test~='.DMS' & test~='.ZOO' THEN */
  277. IF WORDS(selected)>0 THEN
  278.   DO
  279.     SAY
  280.     SAY 'You may choose to have your selection(s) archived using LhA or LZX.'
  281.     SAY 'Answer [Y] to begin, or [N] to CANCEL ALL your selected files.'
  282.     SAY 'The completed archive will be attached to email addressed to you.'
  283.     SAY
  284.     OPTIONS PROMPT  'Archive selected files? (nY) > '
  285.     PULL temp
  286.     temp=UPPER(temp)
  287.     IF LEFT(temp,1)~='N' THEN
  288.       DO
  289.         DO jj = 1
  290.           SAY ' '
  291.           IF lzxflag='Y' THEN
  292.             DO
  293.               OPTIONS PROMPT  'Archive using lz(X) or l(H)a? (xH) > '
  294.               PULL temp
  295.               IF temp='' THEN iterate jj
  296.               temp=LEFT(UPPER(temp),1)
  297.               IF temp~='X' & temp~='H' THEN iterate jj
  298.             END
  299.           ELSE
  300.               temp='H' /* default to LHA if config flag not set */
  301.           ADDRESS AREXX bbsArcExt.rexx name nodex temp selected
  302.           LEAVE jj
  303.         END
  304.         selected=''
  305.         SAY
  306.         SAY 'The BBS will notify you online when your archive is ready.'
  307.         SAY
  308.       END
  309.  
  310.   END
  311. SAY 'Returning to the BBS...'
  312. SAY 
  313. EXIT
  314.  
  315.  
  316. makepicklist:
  317. IF path='' THEN RETURN ''
  318. IF STORAGE()<100000 THEN
  319.   DO
  320.     lists.=''
  321.     lists.0=0
  322.     IF WORDS(devlist)>1 THEN
  323.       DO
  324.         lists.0=1
  325.         lists.1.0=devlist
  326.       END
  327.   END
  328. DO i=1 TO lists.0
  329.   IF path=lists.i THEN RETURN lists.i.0
  330. END
  331. cname=STRIP(RIGHT(COMPRESS(path,' ._-:/'),29))
  332. IF cname~='' & EXISTS(bbspath'Cache/'cname) THEN
  333.   DO cloop=1 TO 1
  334.     k=lists.0+1
  335.     lists.0=k
  336.     x=OPEN(f,bbspath'Cache/'cname'.','R')
  337.     IF x=0 THEN SAY bbspath'Cache/'cname'. failed to open!'
  338.     ELSE
  339.       DO
  340.         cpath=READLN(f)
  341.         IF cpath=path THEN lists.k=path
  342.         ELSE
  343.           DO
  344.             IF level>sysoplevel THEN
  345.               SAY path 'does not match cache path in' cname'. !'
  346.             CALL CLOSE(f)
  347.             lists.0=lists.0-1
  348.             LEAVE cloop
  349.           END
  350.         DO i=1
  351.           line=READLN(f)
  352.           IF EOF(f) THEN LEAVE i
  353.           IF colorflag~=1 THEN
  354.             DO
  355.               n=POS('1B'x,line)
  356.               DO WHILE n>0
  357.                 DO m=2
  358.                   IF DATATYPE(SUBSTR(line,n+m,1),'M') | (n+m+1)>LENGTH(line) THEN
  359.                     leave m
  360.                 END
  361.                 line=DELSTR(line,n,m+1)
  362.                 n=POS('1B'x,line)
  363.               END
  364.             END
  365.           lists.k.i=line
  366.         END
  367.         CALL CLOSE(f)
  368.         lists.k.ROWS=i-1
  369.       END
  370.     x=OPEN(f,bbspath'Cache/'cname,'R')
  371.     IF x=0 THEN
  372.       DO
  373.         SAY bbspath'Cache/cname failed to open!'CR
  374.         CALL CLOSE(f)
  375.         lists.0=lists.0-1
  376.         LEAVE cloop
  377.       END
  378.     ELSE
  379.       DO
  380.         plist=READCH(f,65000)
  381.         CALL CLOSE(f)
  382.         lists.k.0=plist
  383.         RETURN plist
  384.       END
  385.   END
  386. SAY 'Loading...'CR
  387. CALL FileList(path'*',filelist,'F','N')
  388. IF filelist.0>1 THEN CALL QSORT(1,filelist.0,filelist)
  389. CALL FileList(path'*',dirlist,'D','N')
  390. IF dirlist.0>1 THEN CALL QSORT(1,dirlist.0,dirlist)
  391. plist=''
  392. dirs=0
  393. longest=0
  394. DO i=1 TO filelist.0
  395.   IF WORDS(filelist.i)~=1 THEN ITERATE i
  396.   IF filelist.i='' THEN ITERATE i
  397.   IF UPPER(RIGHT(filelist.i,5))='.INFO' THEN ITERATE i
  398.   IF FIND(exclude,UPPER(path||filelist.i))>0 THEN ITERATE i
  399.   plist=STRIP(plist filelist.i)
  400.   IF LENGTH(filelist.i)>longest THEN longest=LENGTH(filelist.i)
  401. END
  402. DO i=1 TO dirlist.0
  403.   IF WORDS(dirlist.i)~=1 THEN ITERATE i
  404.   IF FIND(exclude,UPPER(path||dirlist.i))>0 THEN ITERATE i
  405.   plist=STRIP(plist dirlist.i)
  406.   IF LENGTH(dirlist.i)>longest THEN longest=LENGTH(dirlist.i)
  407.   dirs=dirs+1
  408. END
  409. cols=76%(longest+9)
  410. lists.0=lists.0+1
  411. i=lists.0
  412. lists.i=path
  413. lists.i.0=plist
  414. DROP filelist. dirlist. 
  415. RETURN plist
  416.  
  417.  
  418. pick:
  419. PARSE ARG list 
  420. selection=''
  421. DO k=1 TO lists.0
  422.   IF path=lists.k THEN LEAVE k
  423. END
  424. IF ~DATATYPE(lists.k.ROWS,'N') THEN
  425.   DO
  426.     items=WORDS(list)
  427.     IF items<75 & dirs<25 THEN SAY 'Formatting' items 'items...'
  428.     ELSE SAY 'Please be patient, formatting' items 'items may take a while the first time...'
  429.     lists.k.ROWS=(items%cols)+((items//cols)>0)
  430.     IF cols>items THEN cols=items
  431.     IF cols<1 THEN cols=1
  432.     longest=(76%cols)-8
  433.     lists.k=path
  434.     DO j=0 TO cols-1
  435.       DO i=1 TO lists.k.ROWS
  436.         thisnum=j*lists.k.ROWS+i
  437.         IF thisnum<=items THEN
  438.           DO
  439.             thisitem=WORD(list,thisnum)
  440.             filestat=STATEF(path||thisitem)
  441.             thisitem=LEFT(thisitem,longest)' '
  442.             IF WORD(filestat,1)='DIR' THEN
  443.               lists.k.i=lists.k.i||pen3'(dir) 'thisitem||def
  444.             ELSE
  445.               DO
  446.                 bytes=WORD(filestat,2)
  447.                 IF bytes<10000 THEN 
  448.                   lists.k.i=lists.k.i||RIGHT(bytes,5) thisitem
  449.                 ELSE IF bytes>1023999 THEN 
  450.                   lists.k.i=lists.k.i||RIGHT(bytes%1024000,4)'m' thisitem
  451.                 ELSE lists.k.i=lists.k.i||RIGHT(bytes%1024,4)'k' thisitem
  452.               END
  453.           END
  454.       END
  455.     END
  456.     IF level>sysoplevel & items>24 THEN
  457.       DO
  458.         SAY items 'items,' dirs 'dirs,' lists.k.ROWS 'rows'
  459.         OPTIONS PROMPT  'FileCache' path'? (Ny) > '
  460.         PULL junk
  461.         junk=UPPER(LEFT(junk,1))
  462.         IF junk='Y' THEN
  463.           DO
  464.             CALL MAKEDIR(bbspath'Cache')
  465.             cname=STRIP(RIGHT(COMPRESS(path,' ._-:/'),29))
  466.             x=OPEN(f,bbspath'Cache/'cname,'W')
  467.             IF x=0 THEN SAY 'Unable to open cache file' cname'!'
  468.             ELSE
  469.               DO
  470.                 CALL WRITECH(f,list)
  471.                 CALL CLOSE(f)
  472.               END
  473.             x=OPEN(f,bbspath'Cache/'cname'.','W')
  474.             IF x=0 THEN
  475.               DO
  476.                 SAY 'Unable to open cache file' cname'. !'CR
  477.                 CALL DELETE(bbspath'Cache/'cname)
  478.               END
  479.             ELSE
  480.               DO
  481.                 CALL WRITELN(f,path)
  482.                 DO i=1 TO lists.k.ROWS
  483.                   CALL WRITELN(f,TRIM(lists.k.i))
  484.                 END
  485.                 CALL CLOSE(f)
  486.                 SAY path 'has been cached.'
  487.               END
  488.           END
  489.       END
  490.   END
  491. IF selected~='' THEN
  492.   DO
  493.     SAY
  494.     w=WORDS(selected)
  495.     temp=pen3' 'w def'selected files.'
  496.     IF shosel~=1 THEN
  497.       DO
  498.         saytxt=pen3'selected:'def||CR
  499.         SAY saytxt
  500.         DO i=1 TO w
  501.           saytxt=WORD(selected,i)||CR
  502.           SAY saytxt
  503.         END
  504.       END
  505.     ELSE
  506.     DO
  507.       temp='Enter' pen3'SHOW S'def'elected to display'temp
  508.       SAY temp||CR
  509.     END
  510.     IF w>5 THEN shosel=1
  511.   END
  512. SAY CR
  513. saytxt='current path ='pen3 path||def||CR
  514. SAY saytxt
  515. saytxt=LEFT('-',75,'-')||CR
  516. SAY saytxt
  517. DO i=1 TO lists.k.ROWS
  518.   saytxt=TRIM(lists.k.i)||CR
  519.   SAY saytxt
  520.   IF (i+2)//(linesperpage-1)=0 & nonstop~=1 THEN
  521.     DO
  522.       CALL whodat()
  523.       OPTIONS PROMPT   ' - ['pen3'N'def']on-stop  ['pen3'Q'def']uit  ['pen3'RETURN'def']=Continue - '
  524.       PULL junk
  525.       IF LEFT(UPPER(junk),1)='Q' THEN LEAVE i
  526.       IF LEFT(UPPER(junk),1)='N' THEN nonstop=1
  527.     END
  528. END
  529. nonstop=0
  530. saytxt=LEFT('-',75,'-')||CR
  531. SAY saytxt
  532. CALL whodat()
  533. readflag=0
  534. DO getloop=1
  535.   pstring=showtime()'   Enter ''?'' for HELP > '
  536.   OPTIONS PROMPT pstring
  537.   PARSE PULL selection
  538.   /* PARSE selection */
  539.   IF selection='?' THEN
  540.     DO
  541.       CALL help()
  542.       OPTIONS PROMPT  'Press RETURN'
  543.       PULL junk
  544.       selection=';-)'
  545.       LEAVE getloop
  546.     END
  547.   IF LEFT(selection,1)='/' THEN selection=STRIP(SUBSTR(selection,2))
  548.   IF WORDS(selection)>1 THEN
  549.     DO
  550.       IF LEFT(UPPER(selection),6)='SHOW S' THEN
  551.         DO
  552.           shosel=''
  553.           selection=';-)'
  554.           LEAVE getloop
  555.         END
  556.       IF UPPER(selection)='SELECT ALL' THEN
  557.         DO
  558.           IF path='' | RIGHT(path,1)=':' | POS(UPPER(path),UPPER(devlist))>0 THEN
  559.             DO
  560.               SAY
  561.               saytxt=pen3'*** Archiving entire devices at one time is NOT allowed! ***'def||CR
  562.               SAY saytxt
  563.               SAY
  564.               ITERATE getloop
  565.             END
  566.           CALL selall(path xrecursive_size)
  567.           shosel=''
  568.           selection=':-)'
  569.           LEAVE getloop
  570.         END
  571.       ELSE IF UPPER(WORD(selection,1))='READ' THEN
  572.         DO
  573.           readflag=1
  574.           selection=STRIP(DELWORD(selection,1,1))
  575.         END
  576.       ELSE IF UPPER(WORD(selection,1))='CD' THEN selection=SUBSTR(selection,4)
  577.       ELSE IF UPPER(WORD(selection,1))='DIR' THEN selection=SUBSTR(selection,5)
  578.     END
  579.   i=FIND('DONE' UPPER(list),UPPER(selection))
  580.   IF i=0 THEN
  581.     DO
  582.       i=FIND('DONE' UPPER(list),UPPER(selection':'))
  583.       IF i=0 THEN
  584.         DO
  585.           IF UPPER(selection)='KINGFISHER' THEN
  586.             DO
  587.               IF EXISTS('rexx:KingFisher.rexx') THEN
  588.                 CALL KingFisher.rexx(name '. .' colorflag maxtime)
  589.               ELSE IF EXISTS(bbspath'rexxDoors/KingFisher.rexx') THEN
  590.                 DO
  591.                   curdir=PRAGMA('D',bbspath'rexxDoors')
  592.                   CALL KingFisher.rexx(name '. .' colorflag maxtime)
  593.                   curdir=PRAGMA('D',curdir)
  594.                 END
  595.               ELSE SAY 'KingFisher.rexx not found!'
  596.               ITERATE getloop
  597.             END
  598.           ELSE IF UPPER(selection)='Q' THEN selection='DONE'
  599.           ELSE ITERATE getloop
  600.         END
  601.       ELSE selection=selection':'
  602.     END
  603.   IF selection='' & path='' THEN ITERATE getloop
  604.   ELSE IF i>1 THEN selection=WORD(list,i-1)
  605.   IF readflag=1 THEN
  606.     DO
  607.       endtest=UPPER(RIGHT(selection,4))
  608.       IF FIND('.ARC .DMS .LZH .LHA .ZIP .ZOO',endtest)>0 THEN
  609.         DO
  610.           CALL Contents.rexx(path||selection)
  611.           IF EXISTS('RAM:CONTENTS') THEN CALL showtext('RAM: CONTENTS')
  612.         END
  613.       ELSE CALL showtext(path selection)
  614.       readflag=0
  615.       selection=';-)'
  616.     END
  617.   LEAVE getloop
  618. END
  619. RETURN selection
  620.  
  621.  
  622. selall: PROCEDURE EXPOSE selected pen3 def CR
  623. PARSE ARG dir xrecursive_size .
  624. IF FIND(exclude,UPPER(dir))>0 THEN RETURN
  625. saytxt='Sizing'pen3 dir||def||CR
  626. SAY saytxt
  627. IF RIGHT(dir,1)~='/' THEN dir=dir'/'
  628.  
  629. /* DAS */
  630.  
  631. sizefile='RAM:bbsCDsize'nodex
  632. ADDRESS COMMAND 'c:nl >'sizefile' 'dir' -Z -W -F'
  633. ADDRESS COMMAND 'c:WAIT 5'
  634. okflag=0
  635. fsize=0
  636. DO zloop=1 TO 10
  637.   zz=OPEN(f10,sizefile,'r')
  638.   IF zz=0 THEN
  639.   DO
  640.     SAY 'Waiting for Sizefile...'
  641.     ADDRESS COMMAND 'c:WAIT 5'
  642.     ITERATE zloop
  643.   END
  644.   ELSE
  645.     DO
  646.       okflag=1
  647.       LEAVE zloop
  648.     END
  649. END
  650. IF okflag~=1 THEN
  651. DO
  652.   SAY 'Sorry, too many files... SELECT ALL cancelled!'
  653.   ADDRESS COMMAND 'C:WAIT 2'
  654.   RETURN
  655. END
  656. zzsizetot=0
  657. zzfiletot=0
  658. zzdirtot=0
  659. zzpath=''
  660. DO zz2=1
  661.   line = READLN(f10)
  662.   IF EOF(f10) THEN LEAVE zz2
  663.   IF line='' THEN ITERATE
  664.   IF UPPER(WORD(line,2))='FILES' THEN 
  665.   DO
  666.     IF UPPER(WORD(line,1))='NO' THEN iterate zz2
  667.     SAY RIGHT(zzpath,32)', 'VALUE(WORD(line,1))' file(s), 'VALUE(WORD(line,13))' bytes'
  668.     zzsizetot=zzsizetot+VALUE(WORD(line,13))
  669.     zzfiletot=zzfiletot+VALUE(WORD(line,1))
  670.     zzdirtot=zzdirtot+1
  671.   END
  672. ELSE IF UPPER(WORD(line,1))="DIRECTORY" THEN zzpath=WORD(line,3)
  673. END
  674. CALL CLOSE(f10)
  675. saytxt=pen3'Total:'def' 'zzdirtot''pen3' dir(s), 'def''zzfiletot''pen3' file(s), 'def''zzsizetot''pen3' bytes'||def||CR
  676. SAY saytxt
  677. IF zzsizetot>xrecursive_size THEN
  678. DO
  679.   saytxt=pen3'*CANCELLED*'def' the maximum bytes allowed per 'pen3'SELECT ALL'def' is: 'pen3''xrecursive_size' bytes!!!'||def||CR
  680.   SAY saytxt
  681. END
  682. IF zzsizetot~>xrecursive_size THEN selected=selected' 'dir'*'
  683. ADDRESS COMMAND 'C:WAIT 4'
  684. RETURN
  685.  
  686.  
  687. showtext:
  688. PARSE ARG tpath' 'textfile 
  689. test=RIGHT(tpath,1)
  690. IF test~='' & test~=':' & test~='/' THEN tpath=tpath'/'
  691. x=OPEN(f,STRIP(tpath||textfile),'R')
  692. IF x=0 THEN RETURN
  693. test=READCH(f,64)
  694. mask=XRANGE(,'06'x)||XRANGE('0E'x,'1A'x)||XRANGE('1C'x,'1F'x)
  695. IF VERIFY(test,mask,'M')>0 THEN
  696.   DO
  697.     CALL CLOSE(f)
  698.     testloc=VERIFY(test,mask,'M')
  699.     saytxt='*** not an archive or a text file! ***'CR
  700.     SAY saytxt
  701.     saytxt='Character number' testloc 'is ASCII' C2D(SUBSTR(test,testloc,1))||CR
  702.     SAY saytxt
  703.     RETURN
  704.   END
  705. CALL SEEK(f,0,'B')
  706. SAY
  707. saytxt='-' tpath||textfile '-'CR
  708. SAY saytxt
  709. DO i=1 WHILE ~EOF(f)
  710.   saytxt=COMPRESS(READLN(f),CR||'0C'x)||CR
  711.   SAY saytxt
  712.   IF i//(linesperpage-1)=0 & nonstop~=1 THEN
  713.     DO
  714.       CALL whodat()
  715. OPTIONS PROMPT  ' - ['pen3'N'def']on-stop  ['pen3'Q'def']uit  ['pen3'RETURN'def']=Continue - '
  716.       PULL junk
  717.       IF LEFT(UPPER(junk),1)='Q' THEN LEAVE i
  718.       IF LEFT(UPPER(junk),1)='N' THEN nonstop=1
  719.    /*   IF colorflag=1 | ADDRESS()~='BAUD'THEN
  720.         saytxt='1B'x'M'||LEFT('',60)||'1B'x'M'||CR
  721.         SAY saytxt */
  722.     END
  723. END
  724. CALL CLOSE(f)
  725. IF i//(linesperpage-1)>1 THEN
  726.   DO
  727.     OPTIONS PROMPT  ' - ['pen3'RETURN'def']=Continue - '
  728.     PULL junk
  729.   END
  730. nonstop=0
  731. RETURN
  732.  
  733.  
  734. whodat:
  735. IF ADDRESS()~='BAUD' THEN RETURN
  736. MSG RIGHT(' ',66-LENGTH(name)) '1B'x'M'||''||''||' 'name' level 'level' '||''
  737. RETURN
  738.  
  739.  
  740. help:
  741. SAY
  742. SAY
  743. saytxt=pen3'- HELP -'def
  744. SAY saytxt
  745. SAY
  746. saytxt='You can navigate through directory levels using the following commands.'CR
  747. SAY saytxt
  748. saytxt='Remember that the name must appear in the display before you can select it.'CR
  749. SAY saytxt
  750. saytxt='Filenames are displayed with their filesizes on the left, and directories'CR
  751. SAY saytxt
  752. saytxt='will have a' pen3'(dir)'def' on their left.'CR
  753. SAY saytxt
  754. SAY
  755. saytxt='To select an item from the displayed list, enter its name as displayed.'CR
  756. SAY saytxt
  757. saytxt='If the selected item is a' pen3'directory'def', its contents will be displayed.'CR
  758. SAY saytxt
  759. saytxt='If the selected item is a file, it is added to the ''selected'' list.'CR
  760. SAY saytxt
  761. saytxt='To remove a selected file from the list, enter its name again.'CR
  762. SAY saytxt
  763. SAY
  764. saytxt='To display the parent directory, enter an ''empty'' RETURN'CR
  765. SAY saytxt
  766. saytxt='To read a textfile or see the contents of an archive, enter' pen3'READ'def 'filename.'CR
  767. SAY saytxt
  768. saytxt='To select ALL items from the current display, including the contents of all'CR
  769. SAY saytxt
  770. saytxt='displayed directories and their sub-directories, enter 'pen3'SELECT ALL'def'.'CR
  771. SAY saytxt
  772. SAY
  773. IF EXISTS('rexx:KingFisher.rexx') | EXISTS(bbspath'rexxDoors/KingFisher.rexx') THEN
  774.   DO
  775.     saytxt='Enter 'pen3'KINGFISHER'def' to use the online search utility.'CR
  776.     SAY saytxt
  777.   END
  778. SAY
  779. saytxt='Enter'pen3 'DONE' def'to return to the BBS (and download any selected files)'CR
  780. SAY saytxt
  781. SAY
  782. RETURN
  783.  
  784.  
  785. showtime:
  786. mins=(maxtime-TIME('E'))%60
  787. secs=TRUNC((maxtime-TIME('E'))//60)
  788. IF secs<10 THEN secs='0'secs
  789. RETURN 'Time Remaining: 'mins':'secs
  790.  
  791.  
  792. BREAK_E:
  793. SAY
  794. saytxt=pen3'*** CONTROL-E BREAK ***'def||CR
  795. SAY saytxt
  796. i=999999
  797. RETURN ''
  798.  
  799.  
  800. BREAK_C:
  801. SAY CR
  802. EXIT ''
  803.  
  804. /* bbsExtDL.baud */
  805.